package helper.base

import java.io.Serializable

typealias A2Tuple<A1, A2> = Pair<A1, A2>
typealias A3Tuple<A1, A2, A3> = Triple<A1, A2, A3>

object TupleHelper {
    object GetTuple {
        fun <A1, A2> getA2Tuple(
            a1: A1,
            a2: A2
        ): A2Tuple<A1, A2> {
            return A2Tuple(
                a1,
                a2,
            )
        }

        fun <A1, A2, A3> getA3Tuple(
            a1: A1,
            a2: A2,
            a3: A3,
        ): A3Tuple<A1, A2, A3> {
            return A3Tuple(
                a1,
                a2,
                a3,
            )
        }

        fun <A1, A2, A3, A4> getA4Tuple(
            a1: A1,
            a2: A2,
            a3: A3,
            a4: A4,
        ): A4Tuple<A1, A2, A3, A4> {
            return A4Tuple(
                a1,
                a2,
                a3,
                a4,
            )
        }
    }

    object A2TupleExpand {
        fun <A1, A2> A2Tuple<A1, A2>.swap(): A2Tuple<A2, A1> {
            return this.second to this.first
        }

        fun A2Tuple<Int, Int>.getIntRangeLength(
        ): Int {
            return second - first + 1
        }
    }

    data class A4Tuple<out A1, out A2, out A3, out A4>(
        val a1: A1,
        val a2: A2,
        val a3: A3,
        val a4: A4
    ) : Serializable {
        override fun toString(): String = "($a1, $a2, $a3, $a4)"
    }

    data class A5Tuple<out A1, out A2, out A3, out A4, out A5>(
        val a1: A1,
        val a2: A2,
        val a3: A3,
        val a4: A4,
        val a5: A5
    ) : Serializable {
        override fun toString(): String = "($a1, $a2, $a3, $a4, $a5)"
    }

    data class A6Tuple<out A1, out A2, out A3, out A4, out A5, out A6>(
        val a1: A1,
        val a2: A2,
        val a3: A3,
        val a4: A4,
        val a5: A5,
        val a6: A6
    ) : Serializable {
        override fun toString(): String = "($a1, $a2, $a3, $a4, $a5, $a6)"
    }
}
